package com.cskaoyan.javase.exception._2finally;

/**
 * @description: finally关键字
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * finally关键字不能单独使用,必须配合try..catch或者配合try..代码块使用
 * 它本身也表示一个代码块结构 --- finally代码块
 *
 * try..catch之后使用finally代码块,如果catch代码块捕获异常,那么catch代码块会先于finally代码块执行
 * 如果没有异常,finally代码块也会执行
 * 特殊的,如果catch没有正常捕获异常,那么finally代码块也会执行
 *
 * 所以finally在try..catch任何执行的情况下都会被执行,根据它的这种一定执行的特点,所以java程序员经常把释放资源的代码放入
 *      finally代码块中,这样能够确保释放资源代码一定被执行,资源一定会被释放
 * 在做资源使用的代码中,是会经常产生异常的,比如I/O操作,网络操作等等,这个时候一旦产生异常,程序终止,如果没有finally代码块,资源就得不到正常释放.而如果使用finally代码块,无论程序怎么执行,释放资源的代码都一定会正常运行
 *
 *
 * > 一些奇思妙想
 * - try代码块如果有return
 *   - 程序会先执行完finally代码块，回过头执行try中的return
 *
 * - catch代码块中如果有return，并且catch正常捕获异常执行
 *   - 程序会先执行完finally代码块后，再回去执行catch中return，从catch代码块中结束方法
 *
 * - finally代码中有return
 *   - 不会影响finally代码块执行
 *
 * - 如果finally和catch中都有return
 *   - 程序会直接从finally代码块中的return结束方法
 *
 * - 如果try中的异常不能正常捕获,但是finally中有return
 *   - **注意此时程序会跳过这个异常，不会抛出异常给JVM报错**
 * - try中的return语句return的是一个方法，但是这个方法又产生了异常
 *   - 自己测试一下吧哈哈
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println("before");
        try {
            //System.exit(0);
            //int a = 10;
            //return;
            System.out.println(10/0);
        } catch (NullPointerException e) {
            e.printStackTrace();
            //return;
        }finally {
            System.out.println("finally代码块执行了!");
            return;
        }
        //System.out.println("after");
    }
}
